package com.demo.dao;


import java.util.List;

import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.repository.Query;
import org.springframework.transaction.annotation.Transactional;

import com.demo.entity.Employee;

/**
 * @类名称：EmployeeDao @类描述：
 * @创建人：YangChao
 * @创建时间：2017年9月13日 下午6:23:07
 * @version 1.0.0
 */
public interface EmployeeDao extends BaseDao<Employee> {

	/**
	 * 自定义简单查询自定义的简单查询就是根据方法名来自动生成SQL，
	 * 主要的语法是findXXBy ,readAXXBy ,queryXXBy ,countXXBy , getXXBy 后面跟属性名称：
	 * 也使用一些加一些关键字And 、 Or
	 * 修改、删除、统计也是类似语法
	 * 基本上SQL体系中的关键词都可以使用，例如：LIKE 、 IgnoreCase 、 OrderBy
	 * @Title: findByPhone
	 * @param phone
	 * @return 
	 * @author YangChao
	 * @date 2017年9月15日 上午10:24:46
	 */
	List<Employee> findByPhone(String phone);
	
	Employee findById(Long id);
	
	@Query("select e from Employee e where e.email = ?1")
	Employee findByEmail(String email);
	
	/*
	 * 自定义SQL查询其实Spring data 觉大部分的SQL都可以根据方法名定义的方式来实现，
	 * 但是由于某些原因我们想使用自定义的SQL来查询，spring data也是完美支持的；在SQL的查询方法上面使用@Query 注解，
	 * 如涉及到删除和修改在需要加上@Modifying .也可以根据需要添加 @Transactional 对事物的支持，查询超时的设置等
	 */
	@Transactional(timeout = 10)
	@Query(value = "select e.* from crm_employee e where e.login_name = ?1", nativeQuery = true)
	Employee findByLoginName(String loginName);
	
	/**
	 * 限制查询
	 * 有时候我们只需要查询前N个元素，或者支取前一个实体。
	 */
	Employee findFirstByOrderById();

	Employee findTopByOrderByIdDesc();

	List<Employee> findFirst10ByName(String name, Sort sort);

	List<Employee> findTop10ByName(String name, Pageable pageable);
	
}
